home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / SLAX 6.0.8 / slax-6.0.8.iso / slax / tools / deactivate < prev    next >
Text File  |  2008-11-21  |  2KB  |  79 lines

  1. #!/bin/bash
  2. # Deactivate module from the root directory structure on the fly
  3. # This may fail for many cases, most likely when your module is 'busy'
  4. # - for example if you have files open from the module yet.
  5. #
  6. # Author: Tomas M. <http://www.linux-live.org>
  7.  
  8. if [ "$1" = "-k" ]; then
  9.    CALLED_BY_KDE_HELPER=1
  10.    shift
  11. fi
  12.  
  13. if [ -e /usr/bin/kdeactivate -a "$DISPLAY" -a ! "$CALLED_BY_KDE_HELPER" ]; then
  14.    exec /usr/bin/kdeactivate "$@" 2>/dev/null
  15. fi
  16.  
  17. PATH=.:$(dirname $0):/usr/lib:$PATH
  18. . liblinuxlive || exit 5
  19.  
  20. allow_only_root
  21. MODULE=$(basename "$1" .lzm).lzm
  22. IMAGES=/mnt/live/memory/images
  23. IPREV=empty
  24.  
  25. if [ "$MODULE" = "" -o ! -e "$IMAGES/$MODULE" ]; then
  26.    echo
  27.    echo "Deactivate module from the root filesystem while running Linux Live"
  28.    echo "Usage: $0 module.lzm"
  29.    exit 1
  30. fi
  31.  
  32. # if the module contains /var/lock/deactivatelock, deny deactivation
  33. if [ -e "$IMAGES/$MODULE/var/lock/deactivatelock" ]; then
  34.    echo "Can't deactivate the given module, I am sorry."
  35.    exit 2
  36. fi
  37.  
  38. try_remount()
  39. {
  40.    mount -t aufs -o remount,verbose,del:$IMAGES/$MODULE aufs / 2>/dev/null
  41. }
  42.  
  43. # Try to simply remove the dir first. If succeeds, finish
  44. rmdir "$IMAGES/$MODULE" 2>/dev/null && exit 0
  45. # OK the previous trick didn't work. So we have a real module here.
  46.  
  47. # First, try to stop all daemons which may be started by this module
  48. find_n_run_scripts $IMAGES/$MODULE stop deactivate
  49.  
  50. # detach it from aufs union. This may take a long time, remounting the
  51. # root directory is an expensive operation.
  52. try_remount
  53.  
  54. # if remount fails, try to free all inotify watchers and remount again
  55. while [ $? -ne 0 -a "$IPREV" != "$INODE" ]; do
  56.    IPREV="$INODE"
  57.    INODE=$(dmesg | fgrep "test_inode_busy" | tail -n 1 | cut -d : -f 4 | cut -b 8-)
  58.    if [ "$INODE" != "" ]; then
  59.       find / -noleaf -xdev -inum "$INODE"
  60.       find / -noleaf -xdev -inum "$INODE" | xargs touch
  61.       try_remount
  62.    fi
  63. done
  64.  
  65. if [ $? -ne 0 ]; then
  66.    echo "The module can't be removed, because it's busy (used)." >&2
  67.    exit 3
  68. fi
  69.  
  70. # if we are here, the module has been successfuly removed from aufs union
  71. # so now we have to umount the lzm file and then free the loop device
  72. LOOP=$(cat /proc/mounts | grep "$IMAGES/$MODULE " | cut -d " " -f 1)
  73. umount -n "$IMAGES/$MODULE" 2>/dev/null
  74. if [ $? -ne 0 ]; then
  75.    exit 4
  76. fi
  77. losetup -d "$LOOP" 2>/dev/null # sometimes it's freed by umount automatically
  78. rmdir "$IMAGES/$MODULE" # if not empty or busy, a message will be shown
  79.